# encoding: utf-8

# 初始学分为0
credit = 0


# 学习一次加10分
def study():
    global credit
    credit += 10


# 选修一次加5分
def elective():
    global credit
    credit += 5


study()
study()
study()
elective()
elective()
elective()
print(credit)

# 程序猿一个失误 学分清零 白学了
credit = 0
print(credit)

"""
闭包函数：在外函数中返回内函数，这个返回的函数叫做闭包函数
    
    1.特点
    (1)在外函数中定义了局部变量，并且在内函数中使用了局部变量.
    (2)在内函数中使用外函数定义的局部变量.
    (3)保护了外函数中的局部变量，既可以使用，也不会被破坏(例如在外函数外部修改局部变量的值是不允许的).
    满足以上(1)(2)才能构成一个闭包函数
"""


# 优化改造,防止在函数外部将学分清零
def student():
    credit = 0  # 在外函数中定义了局部变量

    def study():
        nonlocal credit
        credit += 10  # 在内函数中使用外函数定义的局部变量
        print(credit)
    # 在外函数中返回内函数，返回的函数叫做闭包函数
    return study


stu1 = student()
stu1()
stu1()
# 清零学分并不会影响stu1的学分
credit = 0
stu1()

# 使用__closure__可以检测一个函数是不是闭包函数
# 如果不报错的话说明是一个闭包函数
print(student().__closure__)

